package banco.pessoa;

import excecoes.estoque.DinheiroNegativoException;
import excecoes.pessoa.CpfCnpjExistenteException;
import excecoes.pessoa.LocalizacaoInvalidaException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.JOptionPane;
import banco.Conexao;
import excecoes.pessoa.CpfCnpjInvalidoException;
import excecoes.pessoa.NomeInvalidoException;
import java.sql.Statement;
import smartMarket.pessoa.Funcionario;
import smartMarket.pessoa.Pessoa;

public class BancoFuncionario extends Conexao {

    public BancoFuncionario() {
        super();
    }

    public void alterar(Funcionario funcionario) throws SQLException {
        PreparedStatement st = conexao.prepareStatement("update funcionario set nome = ?, permissao = ?, cpf = ?,uf = ?,telefone = ?,salario = ?,endereco = ?,bairro = ?,cidade = ?,fone2 = ?,email = ?,senha = ?,cargo = ?"
                + "where codigo = ?");
        st.setString(1, funcionario.getNome());
        st.setBoolean(2, funcionario.isPermissao());
        st.setString(3, funcionario.getCPF_CNPJ());
        st.setInt(4, funcionario.getEstado());
        st.setString(5, funcionario.getTelefone());
        st.setFloat(6, funcionario.getSalario());
        st.setString(7, funcionario.getRua() + ", " + funcionario.getNumero());
        st.setString(8, funcionario.getBairro());
        st.setString(9, funcionario.getCidade());
        st.setString(10, funcionario.getCelular());
        st.setString(11, funcionario.getEmail());
        st.setString(12, funcionario.getSenha());
        st.setString(13, funcionario.getCargo());
        st.setInt(14, funcionario.getCodigo());
        st.execute();
        st.close();
        JOptionPane.showMessageDialog(null, "Funcionario alterado com sucesso");
    }

    public void novo(Funcionario funcionario) throws SQLException {

        PreparedStatement st = conexao.prepareStatement("insert into funcionario(nome, permissao, cpf,uf,telefone,salario,endereco,bairro,cidade,fone2,email,senha,cargo) "
                + "values (?,?,?,?,?,?,?,?,?,?,?,?,?)");
        st.setString(1, funcionario.getNome());
        st.setBoolean(2, funcionario.isPermissao());
        st.setString(3, funcionario.getCPF_CNPJ());
        st.setInt(4, funcionario.getEstado());
        st.setString(5, funcionario.getTelefone());
        st.setFloat(6, funcionario.getSalario());
        st.setString(7, funcionario.getRua() + ", " + funcionario.getNumero());
        st.setString(8, funcionario.getBairro());
        st.setString(9, funcionario.getCidade());
        st.setString(10, funcionario.getCelular());
        st.setString(11, funcionario.getEmail());
        st.setString(12, funcionario.getSenha());
        st.setString(13, funcionario.getCargo());
        st.execute();
        st.close();
        JOptionPane.showMessageDialog(null, "Funcionario cadastrado com sucesso");
    }

    public Funcionario buscar(int codigo) throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, DinheiroNegativoException, CpfCnpjExistenteException, LocalizacaoInvalidaException {
        PreparedStatement st = conexao.prepareStatement("select * from funcionario where codigo = ?");
        st.setInt(1, codigo);
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return null;
        }
        return retornar(rs);
    }

    public Funcionario buscar(String cpf) throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, DinheiroNegativoException, CpfCnpjExistenteException, LocalizacaoInvalidaException {
        PreparedStatement st = conexao.prepareStatement("select * from funcionario where cpf = ?");
        st.setString(1, cpf);
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            JOptionPane.showMessageDialog(null, "Nenhum Funcionario encontrado");
            return null;
        }
        return retornar(rs);
    }

    public void excluir(Funcionario cli) throws SQLException {
        PreparedStatement st = conexao.prepareStatement("delete from funcionario where codigo = ?");
        st.setInt(1, cli.getCodigo());
        st.execute();
        JOptionPane.showMessageDialog(null, "Funcionario excluido com sucesso");
    }

    private Funcionario retornar(ResultSet rs) throws NullPointerException, SQLException, NomeInvalidoException, CpfCnpjInvalidoException, DinheiroNegativoException, CpfCnpjExistenteException, LocalizacaoInvalidaException {
        Funcionario funcionario = new Funcionario();
        funcionario.setCodigo(rs.getInt("codigo"));
        funcionario.setNome(rs.getString("nome"));
        funcionario.setPermissao(rs.getBoolean("permissao"));
        funcionario.setCPF_CNPJ(rs.getString("cpf"));
        funcionario.setEstado(rs.getInt("uf"));
        funcionario.setTelefone(rs.getString("telefone"));
        funcionario.setRua(rs.getString("endereco").split(",")[0]);
        funcionario.setNumero(rs.getString("endereco").split(",")[1]);
        funcionario.setBairro(rs.getString("bairro"));
        funcionario.setCidade(rs.getString("cidade"));
        funcionario.setCelular(rs.getString("fone2"));
        funcionario.setEmail(rs.getString("email"));
        funcionario.setSalario(rs.getFloat("salario"));
        funcionario.setSenha(rs.getString("Senha"));
        funcionario.setCargo(rs.getString("cargo"));
        return funcionario;
    }

    public Integer ultimoFuncionario() throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException {
        PreparedStatement st = conexao.prepareStatement("SELECT MAX(codigo) AS maximo FROM funcionario");

        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return 1;
        }
        return rs.getInt("maximo");
    }

    public Vector<Pessoa> listar() throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, DinheiroNegativoException, CpfCnpjExistenteException, LocalizacaoInvalidaException {
        Vector<Pessoa> produtos = new Vector<Pessoa>();
        PreparedStatement st = conexao.prepareStatement("select * from funcionario");
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return null;
        } else {
            produtos.add(retornar(rs));
            while (rs.next()) {
                produtos.add(retornar(rs));
            }
        }
        return produtos;
    }
    
    public Vector<Funcionario> buscarNome(String nome) {

        try {
            Vector<Funcionario> clientes = new Vector<Funcionario>();
            Statement st = conexao.createStatement();
            ResultSet rs = st.executeQuery("select * from funcionario where nome like '%" + nome + "%'");
            if (!rs.next()) {
                JOptionPane.showMessageDialog(null, "Nenhum produto encontrado");
                return null;
            } else {
                clientes.add(retornar(rs));
                while (rs.next()) {
                    clientes.add(retornar(rs));
                }
                return clientes;
            }
            
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar produto " + e.getMessage());
            return null;
        }
    }     
    
}
